package main

import "fmt"

func main() {
	arr := []int{4, 2, 22, 4, 5, 456, 2, 45, 45, 3, 34, 523, 5, 4, 0, 3, 1}
	fmt.Println(InsertSort(arr))
}

func Swap(arr []int, i, j int) []int {
	temp := arr[i]
	arr[i] = arr[j]
	arr[j] = temp
	return arr
}

/*
插入排序
一般来说，插入排序都采用in-place在数组上实现。具体算法描述如下：

从第一个元素开始，该元素可以认为已经被排序；
取出下一个元素，在已经排序的元素序列中从后向前扫描；
如果该元素（已排序）大于新元素，将该元素移到下一位置；
重复步骤3，直到找到已排序的元素小于或者等于新元素的位置；将新元素插入到该位置后；
*/

func InsertSort(arr []int) []int {
	if len(arr) <= 1 {
		return arr
	}
	for i := 1; i < len(arr); i++ {
		for j := i - 1; j > 0; j-- {
			if arr[j] > arr[j+1] {
				Swap(arr, j, j+1)
			}
		}
	}

	return arr

}
